package com.tang.subject.application.controller.controller;

import com.alibaba.fastjson.JSON;
import com.google.common.base.Preconditions;
import com.tang.common.entity.Result;
import com.tang.subject.application.controller.converter.SubjectCategoryDTOConverter;
import com.tang.subject.application.controller.converter.SubjectLabelDTOConverter;
import com.tang.subject.application.controller.dto.SubjectCategoryDTO;
import com.tang.subject.domain.entity.SubjectCategoryBO;
import com.tang.subject.domain.service.SubjectCategoryDomainService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@RestController
@RequestMapping("/subject/category")
public class SubjectCategoryController {

    @Resource
    private SubjectCategoryDomainService subjectCategoryDomainService;

    /**
     * 添加分类信息
     *
     * @param subjectCategoryDTO 待添加的分类信息
     * @return com.tang.subject.common.entity.Result<java.lang.String>
     * @author Tang
     * @date 2024/1/26 18:53
     **/
    @PostMapping("/add")
    public Result<Boolean> addCategory(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("SubjectCategoryController.addCategory.dto:{}", JSON.toJSONString(subjectCategoryDTO));
            }
            Preconditions.checkNotNull(subjectCategoryDTO.getCategoryType(), "分类标签类型不能为空");
            Preconditions.checkArgument(StringUtils.isNotBlank(subjectCategoryDTO.getCategoryName()), "分类标签名称不能为空");
            Preconditions.checkNotNull(subjectCategoryDTO.getParentId(), "分类标签父级id不能为空");
            SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.convertDtoToBo(subjectCategoryDTO);
            Boolean flag = subjectCategoryDomainService.addCategory(subjectCategoryBO);
            return Result.ok(flag);
        } catch (Exception e) {
            log.error("SubjectCategoryController.addCategory.error:{}", JSON.toJSONString(subjectCategoryDTO), e);
            return Result.fail(e.getMessage());
        }
    }

    /**
     * 查询分类
     *
     * @param subjectCategoryDTO 查询参数
     * @return com.tang.subject.common.entity.Result<java.util.List < com.tang.subject.application.controllers.dto.SubjectCategoryDTO>>
     * @author Tang
     * @date 2024/1/26 18:53
     **/
    @PostMapping("/queryPrimaryCategory")
    public Result<List<SubjectCategoryDTO>> queryPrimaryCategory(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("SubjectCategoryController.queryPrimaryCategory.dto:{}", JSON.toJSONString(subjectCategoryDTO));
            }
            SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.convertDtoToBo(subjectCategoryDTO);
            List<SubjectCategoryBO> subjectCategoryBOS = subjectCategoryDomainService.queryCategory(subjectCategoryBO);
            List<SubjectCategoryDTO> subjectCategoryDTOS = SubjectCategoryDTOConverter
                    .INSTANCE.convertBoToDtoList(subjectCategoryBOS);
            return Result.ok(subjectCategoryDTOS);
        } catch (Exception e) {
            log.error("SubjectCategoryController.queryPrimaryCategory.error:{}", e.getMessage(), e);
            return Result.fail("查询失败");
        }
    }

    /**
     * 查询大类下的二级分类
     *
     * @param subjectCategoryDTO 查询参数
     * @return com.tang.subject.common.entity.Result<java.util.List < com.tang.subject.application.controllers.dto.SubjectCategoryDTO>>
     * @author Tang
     * @date 2024/1/26 21:17
     **/
    @PostMapping("/queryCategoryByPrimary")
    public Result<List<SubjectCategoryDTO>> queryCategoryByPrimary(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("SubjectCategoryController.queryCategoryByPrimary.dto:{}", JSON.toJSONString(subjectCategoryDTO));
            }
            Preconditions.checkNotNull(subjectCategoryDTO.getParentId(), "分类父id不能为空");
            Preconditions.checkNotNull(subjectCategoryDTO.getCategoryType(), "分类类型不能为空");
            SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.convertDtoToBo(subjectCategoryDTO);
            List<SubjectCategoryBO> subjectCategoryBOS = subjectCategoryDomainService.queryCategory(subjectCategoryBO);
            List<SubjectCategoryDTO> subjectCategoryDTOS = SubjectCategoryDTOConverter
                    .INSTANCE.convertBoToDtoList(subjectCategoryBOS);
            return Result.ok(subjectCategoryDTOS);
        } catch (Exception e) {
            log.error("SubjectCategoryController.queryCategoryByPrimary.error:{}", e.getMessage(), e);
            return Result.fail("查询失败");
        }
    }

    /**
     * 更新分类信息
     *
     * @param subjectCategoryDTO 待更新的分类数据
     * @return com.tang.subject.common.entity.Result<java.lang.Boolean>
     * @author Tang
     * @date 2024/1/26 18:56
     **/
    @PostMapping("/update")
    public Result<Boolean> updateCategory(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("SubjectCategoryController.updateCategory.dto:{}", JSON.toJSONString(subjectCategoryDTO));
            }
            Preconditions.checkNotNull(subjectCategoryDTO.getId(), "分类id不能为空");
            SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.convertDtoToBo(subjectCategoryDTO);
            boolean flag = subjectCategoryDomainService.updateCategory(subjectCategoryBO);
            return Result.ok(flag);
        } catch (Exception e) {
            log.error("SubjectCategoryController.updateCategory.error:{}", e.getMessage(), e);
            return Result.fail(false);
        }
    }

    /**
     * 删除分类信息
     *
     * @param subjectCategoryDTO 待更新的分类数据
     * @return com.tang.subject.common.entity.Result<java.lang.Boolean>
     * @author Tang
     * @date 2024/1/26 18:56
     **/
    @PostMapping("/delete")
    public Result<Boolean> deleteCategory(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("SubjectCategoryController.deleteCategory.dto:{}", JSON.toJSONString(subjectCategoryDTO));
            }
            Preconditions.checkNotNull(subjectCategoryDTO.getId(), "分类id不能为空");
            SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.convertDtoToBo(subjectCategoryDTO);
            boolean flag = subjectCategoryDomainService.deleteCategory(subjectCategoryBO);
            return Result.ok(flag);
        } catch (Exception e) {
            log.error("SubjectCategoryController.deleteCategory.error:{}", e.getMessage(), e);
            return Result.fail(false);
        }
    }

    /**
     * 查询分类及其标签一次性封装
     *
     * @param subjectCategoryDTO 查询参数
     * @return com.tang.subject.common.entity.Result<java.util.List < com.tang.subject.application.controllers.dto.SubjectCategoryDTO>>
     * @author Tang
     * @date 2024/1/26 18:53
     **/
    @PostMapping("/queryCategoryAndLabel")
    public Result<List<SubjectCategoryDTO>> queryCategoryAndLabel(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("SubjectCategoryController.queryCategoryAndLabel.dto:{}", JSON.toJSONString(subjectCategoryDTO));
            }
            Preconditions.checkNotNull(subjectCategoryDTO.getId(), "分类id不能为空");
            SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.convertDtoToBo(subjectCategoryDTO);
            List<SubjectCategoryBO> subjectCategoryBOS = subjectCategoryDomainService.queryCategoryAndLabel(subjectCategoryBO);
            List<SubjectCategoryDTO> subjectCategoryDTOS = subjectCategoryBOS.stream().map(i -> {
                SubjectCategoryDTO categoryDTO = SubjectCategoryDTOConverter.INSTANCE.convertBoToDto(i);
                categoryDTO.setLabelDtoList(SubjectLabelDTOConverter.INSTANCE.convertBoToDtoList(i.getSubjectLabelBOList()));
                return categoryDTO;
            }).collect(Collectors.toList());
            return Result.ok(subjectCategoryDTOS);
        } catch (Exception e) {
            log.error("SubjectCategoryController.queryCategoryAndLabel.error:{}", e.getMessage(), e);
            return Result.fail("查询失败");
        }
    }
}
